home *** CD-ROM | disk | FTP | other *** search
- #include "fd.h"
- #include "wait.h"
- #include "substdio.h"
- #include "exit.h"
- #include "fork.h"
- #include "error.h"
- #include "tcpto.h"
-
- void initialize(argc,argv)
- int argc;
- char **argv;
- {
- tcpto_clean();
- }
-
- int truncreport = 0;
-
- void report(ss,wstat,s,len)
- substdio *ss;
- int wstat;
- char *s;
- int len;
- {
- int j;
- int k;
- int result;
- int orr;
-
- if (wait_crashed(wstat))
- { substdio_puts(ss,"Zqmail-remote crashed.\n"); return; }
- switch(wait_exitcode(wstat))
- {
- case 0: break;
- case 111: substdio_puts(ss,"ZUnable to run qmail-remote.\n"); return;
- default: substdio_puts(ss,"DUnable to run qmail-remote.\n"); return;
- }
- if (!len)
- { substdio_puts(ss,"Zqmail-remote produced no output.\n"); return; }
-
- result = -1;
- j = 0;
- for (k = 0;k < len;++k)
- if (!s[k])
- {
- if (s[j] == 'K') { result = 1; break; }
- if (s[j] == 'Z') { result = 0; break; }
- if (s[j] == 'D') break;
- j = k + 1;
- }
-
- orr = result;
- switch(s[0])
- {
- case 's': orr = 0; break;
- case 'h': orr = -1;
- }
-
- switch(orr)
- {
- case 1: substdio_put(ss,"K",1); break;
- case 0: substdio_put(ss,"Z",1); break;
- case -1: substdio_put(ss,"D",1); break;
- }
-
- for (k = 1;k < len;)
- if (!s[k++])
- {
- substdio_puts(ss,s + 1);
- if (result <= orr)
- if (k < len)
- switch(s[k])
- {
- case 'Z': case 'D': case 'K':
- substdio_puts(ss,s + k + 1);
- }
- break;
- }
- }
-
- int spawn(fdmess,fdout,s,r,at)
- int fdmess; int fdout;
- char *s; char *r; int at;
- {
- int f;
- char *(args[5]);
-
- args[0] = "qmail-remote";
- args[1] = r + at + 1;
- args[2] = s;
- args[3] = r;
- args[4] = 0;
-
- if (!(f = vfork()))
- {
- if (fd_move(0,fdmess) == -1) _exit(111);
- if (fd_move(1,fdout) == -1) _exit(111);
- if (fd_copy(2,1) == -1) _exit(111);
- execvp(*args,args);
- if (error_temp(errno)) _exit(111);
- _exit(100);
- }
- return f;
- }
-